package initialize

import (
	"github.com/Sir-yuChen/funAnalyse/global"
	"github.com/casbin/casbin/util"
	"github.com/casbin/casbin/v2"
	gormadapter "github.com/casbin/gorm-adapter/v3"
	"strings"
)

func InitCasbin() *casbin.Enforcer {
	//最后的一个参数true ，否则默认为false,使用缺省的数据库名casbin,不存在则创建
	adapter, _ := gormadapter.NewAdapter(global.GVA_CONFIG.System.DbType, global.GVA_CONFIG.Mysql.Dsn(), true)
	//创建一个Casbin决策器需要有一个模型文件和策略文件为参数：
	enforcer, _ := casbin.NewEnforcer(global.GVA_CONFIG.Casbin.ModelPath, adapter)
	enforcer.AddFunction("ParamsMatch", ParamsMatchFunc)
	//从DB中 load 策略
	enforcer.LoadPolicy()
	return enforcer
}

// ParamsMatch
//@function: ParamsMatch
//@description: 自定义规则函数
//@param: fullNameKey1 string, key2 string
//@return: bool
func ParamsMatch(fullNameKey1 string, key2 string) bool {
	key1 := strings.Split(fullNameKey1, "?")[0]
	// 剥离路径后再使用casbin的keyMatch2
	return util.KeyMatch2(key1, key2)
}

// ParamsMatchFunc 注册自定义func 比较
//@function: ParamsMatchFunc
//@description: 自定义规则函数
//@param: args ...interface{}
//@return: interface{}, error
func ParamsMatchFunc(args ...interface{}) (interface{}, error) {
	name1 := args[0].(string)
	name2 := args[1].(string)
	return ParamsMatch(name1, name2), nil
}
